package com.wang.cloud.common.core.api;

import com.alibaba.fastjson2.JSONObject;
import lombok.Builder;
import lombok.Data;

import java.util.Objects;

/**
 * API 公共响应体
 *
 * @author wangye
 * @date 2023/6/12
 */
@Data
@Builder
public class ApiResult<T> {
    /**
     * 状态码
     */
    private int code;
    /**
     * 消息
     */
    private String msg;
    /**
     * 错误详细信息
     * 如果需要
     */
    private String detailMsg;
    /**
     * 消息体
     */
    private T data;

    /**
     * 成功返回结果
     */
    public static <T> ApiResult<T> success() {
        return new ApiResult<T>(ApiResultCode.HTTP_OK, "操作成功", null, null);
    }


    /**
     * 成功返回结果
     *
     * @param data 获取的数据
     */
    public static <T> ApiResult<T> success(T data) {
        return new ApiResult<T>(ApiResultCode.HTTP_OK, "操作成功", null, data);
    }

    /**
     * 成功返回结果
     *
     * @param data    获取的数据
     * @param message 提示信息
     */
    public static <T> ApiResult<T> success(T data, String message) {
        return new ApiResult<T>(ApiResultCode.HTTP_OK, message, null, data);
    }


    /**
     * 失败返回结果
     *
     * @param code    错误码
     * @param message 错误信息
     */
    public static <T> ApiResult<T> failed(int code, String message) {
        return new ApiResult<T>(code, message, null, null);
    }

    /**
     * 失败返回结果
     *
     * @param code    错误码
     * @param message 错误信息
     */
    public static <T> ApiResult<T> failed(int code, String message, String detailMsg) {
        return new ApiResult<T>(code, message, detailMsg, null);
    }

    /**
     * 失败返回结果
     *
     * @param message 提示信息
     */
    public static <T> ApiResult<T> failed(String message) {
        return new ApiResult<T>(ApiResultCode.HTTP_INTERNAL_ERROR, message, null, null);
    }

    /**
     * 失败返回结果
     *
     * @param message 提示信息
     */
    public static <T> ApiResult<T> failed(String message, String detailMsg) {
        return new ApiResult<T>(ApiResultCode.HTTP_INTERNAL_ERROR, message, detailMsg, null);
    }


    /**
     * 失败返回结果
     */
    public static <T> ApiResult<T> failed() {
        return new ApiResult<T>(ApiResultCode.HTTP_INTERNAL_ERROR, "服务错误", null, null);
    }


    /**
     * 请求是否成功
     *
     * @return
     */
    public boolean isSuccess() {
        return Objects.equals(ApiResultCode.HTTP_OK, code);
    }

    @Override
    public String toString() {
        return JSONObject.toJSONString(this);
    }
}
